from .base import Object, Set
from .constants import constant, Enum

class WdFieldType(Enum):
    """ 指定 Microsoft Word 域。 除非另有说明，否则本枚举中介绍的域类型都可以通过 "域" 对话框以交互方式添加到 Word 文档中。 有关特定域代码的详细信息，请参阅 Word 帮助。
        WORD (WDFIELDTYPE)
		名称				        值	Description
		wdFieldAddin				81	Add-in 域。 不能通过 "域" 对话框提供。 用于存储不在用户界面上显示的数据。
		wdFieldAddressBlock			93	AddressBlock 域。
		wdFieldAdvance				84	Advance 域。
		wdFieldAsk				    38	Ask 域。
		wdFieldAuthor				17	Author 域。
		wdFieldAutoNum				54	AutoNum 域。
		wdFieldAutoNumLegal			53	AutoNumLgl 域。
		wdFieldAutoNumOutline		52	AutoNumOut 域。
		wdFieldAutoText				79	AutoText 域。
		wdFieldAutoTextList			89	AutoTextList 域。
		wdFieldBarCode				63	BarCode 域。
		wdFieldBidiOutline			92	BidiOutline 域。
		wdFieldComments				19	Comments 域。
		wdFieldCompare				80	Compare 域。
		wdFieldCreateDate			21	CreateDate 域。
		wdFieldData				    40	Data 域。
		wdFieldDatabase				78	Database 域。
		wdFieldDate				    31	Date 域。
		wdFieldDDE				    45	DDE 域。 不再通过 "域" 对话框提供，但早期版本的 Word 所创建文档支持这样做。
		wdFieldDDEAuto				46	DDEAuto 域。 不再通过 "域" 对话框提供，但早期版本的 Word 所创建文档支持这样做。
		wdFieldDisplayBarcode		99	DisplayBarcode 字段。
		wdFieldDocProperty			85	DocProperty 域。
		wdFieldDocVariable			64	DocVariable 域。
		wdFieldEditTime				25	EditTime 域。
		wdFieldEmbed				58	Embedded 域。
		wdFieldEmpty				-1	Empty 域。 充当尚未添加的域内容的占位符。 在用户界面中通过按 Ctrl+F9 添加的域是 Empty 域。
		wdFieldExpression			34	=（公式）域。
		wdFieldFileName				29	FileName 域。
		wdFieldFileSize				69	FileSize 域。
		wdFieldFillIn				39	Fill-In 域。
		wdFieldFootnoteRef			5	FootnoteRef 域。 不能通过 "域" 对话框提供。 以编程方式或交互方式插入。
		wdFieldFormCheckBox			71	FormCheckBox 域。
		wdFieldFormDropDown			83	FormDropDown 域。
		wdFieldFormTextInput		70	FormText 域。
		wdFieldFormula				49	EQ（公式）域。
		wdFieldGlossary				47	Glossary 域。 Word 不再支持该域。
		wdFieldGoToButton			50	GoToButton 域。
		wdFieldGreetingLine			94	GreetingLine 域。
		wdFieldHTMLActiveX			91	HTMLActiveX 域。 目前不支持该域。
		wdFieldHyperlink			88	Hyperlink 域。
		wdFieldIf				    7	If 域。
		wdFieldImport				55	Import 域。 不能通过 "域" 对话框添加，但可以以交互方式或通过代码添加。
		wdFieldInclude				36	Include 域。 不能通过 "域" 对话框添加，但可以以交互方式或通过代码添加。
		wdFieldIncludePicture		67	IncludePicture 域。
		wdFieldIncludeText			68	IncludeText 域。
		wdFieldIndex				8	Index 域。
		wdFieldIndexEntry			4	XE（索引项）域。
		wdFieldInfo				    14	Info 域。
		wdFieldKeyWord				18	Keywords 域。
		wdFieldLastSavedBy			20	LastSavedBy 域。
		wdFieldLink				    56	Link 域。
		wdFieldListNum				90	ListNum 域。
		wdFieldMacroButton			51	MacroButton 域。
		wdFieldMergeBarcode			98	MergeBarcode 字段。
		wdFieldMergeField			59	MergeField 域。
		wdFieldMergeRec				44	MergeRec 域。
		wdFieldMergeSeq				75	MergeSeq 域。
		wdFieldNext				    41	Next 域。
		wdFieldNextIf				42	NextIf 域。
		wdFieldNoteRef				72	NoteRef 域。
		wdFieldNumChars				28	NumChars 域。
		wdFieldNumPages				26	NumPages 域。
		wdFieldNumWords				27	NumWords 域。
		wdFieldOCX				    87	OCX 字段。 不能通过 域 对话框中，添加，但是可以通过代码使用 AddOLEControl 方法的 Shapes 集合或 InlineShapes 集合的添加。
		wdFieldPage				    33	Page 域。
		wdFieldPageRef				37	PageRef 域。
		wdFieldPrint				48	Print 域。
		wdFieldPrintDate			23	PrintDate 域。
		wdFieldPrivate				77	Private 域。
		wdFieldQuote				35	Quote 域。
		wdFieldRef				    3	Ref 域。
		wdFieldRefDoc				11	RD（参考文档）域。
		wdFieldRevisionNum			24	RevNum 域。
		wdFieldSaveDate				22	SaveDate 域。
		wdFieldSection				65	Section 域。
		wdFieldSectionPages			66	SectionPages 域。
		wdFieldSequence				12	Seq（序列）域。
		wdFieldSet				    6	Set 域。
		wdFieldShape				95	Shape 域。 自动为线条图创建的域。
		wdFieldSkipIf				43	SkipIf 域。
		wdFieldStyleRef				10	StyleRef 域。
		wdFieldSubject				16	Subject 域。
		wdFieldSubscriber			82	仅用于 Macintosh。 有关该常量的信息，请参阅包含在 Microsoft Office Macintosh Edition 中的语言参考帮助。
		wdFieldSymbol				57	Symbol 域。
		wdFieldTemplate				30	Template 域。
		wdFieldTime				    32	Time 域。
		wdFieldTitle				15	Title 域。
		wdFieldTOA				    73	TOA（引文目录）域。
		wdFieldTOAEntry				74	TOA（引文目录项）域。
		wdFieldTOC				    13	TOC（目录）域。
		wdFieldTOCEntry				9	TOC（目录项）域。
		wdFieldUserAddress			62	UserAddress 域。
		wdFieldUserInitials			61	UserInitials 域。
		wdFieldUserName				60	UserName 域。
		wdFieldBibliography			97	Bibliography 域。
		wdFieldCitation				96	Citation 域。
    """

    wdFieldAddin = constant('wdFieldAddin')
    wdFieldAddressBlock = constant('wdFieldAddressBlock')
    wdFieldAdvance = constant('wdFieldAdvance')
    wdFieldAsk = constant('wdFieldAsk')
    wdFieldAuthor = constant('wdFieldAuthor')
    wdFieldAutoNum = constant('wdFieldAutoNum')
    wdFieldAutoNumLegal = constant('wdFieldAutoNumLegal')
    wdFieldAutoNumOutline = constant('wdFieldAutoNumOutline')
    wdFieldAutoText = constant('wdFieldAutoText')
    wdFieldAutoTextList = constant('wdFieldAutoTextList')
    wdFieldBarCode = constant('wdFieldBarCode')
    wdFieldBidiOutline = constant('wdFieldBidiOutline')
    wdFieldComments = constant('wdFieldComments')
    wdFieldCompare = constant('wdFieldCompare')
    wdFieldCreateDate = constant('wdFieldCreateDate')
    wdFieldData = constant('wdFieldData')
    wdFieldDatabase = constant('wdFieldDatabase')
    wdFieldDate = constant('wdFieldDate')
    wdFieldDDE = constant('wdFieldDDE')
    wdFieldDDEAuto = constant('wdFieldDDEAuto')
    wdFieldDisplayBarcode = constant('wdFieldDisplayBarcode')
    wdFieldDocProperty = constant('wdFieldDocProperty')
    wdFieldDocVariable = constant('wdFieldDocVariable')
    wdFieldEditTime = constant('wdFieldEditTime')
    wdFieldEmbed = constant('wdFieldEmbed')
    wdFieldEmpty = constant('wdFieldEmpty')
    wdFieldExpression = constant('wdFieldExpression')
    wdFieldFileName = constant('wdFieldFileName')
    wdFieldFileSize = constant('wdFieldFileSize')
    wdFieldFillIn = constant('wdFieldFillIn')
    wdFieldFootnoteRef = constant('wdFieldFootnoteRef')
    wdFieldFormCheckBox = constant('wdFieldFormCheckBox')
    wdFieldFormDropDown = constant('wdFieldFormDropDown')
    wdFieldFormTextInput = constant('wdFieldFormTextInput')
    wdFieldFormula = constant('wdFieldFormula')
    wdFieldGlossary = constant('wdFieldGlossary')
    wdFieldGoToButton = constant('wdFieldGoToButton')
    wdFieldGreetingLine = constant('wdFieldGreetingLine')
    wdFieldHTMLActiveX = constant('wdFieldHTMLActiveX')
    wdFieldHyperlink = constant('wdFieldHyperlink')
    wdFieldIf = constant('wdFieldIf')
    wdFieldImport = constant('wdFieldImport')
    wdFieldInclude = constant('wdFieldInclude')
    wdFieldIncludePicture = constant('wdFieldIncludePicture')
    wdFieldIncludeText = constant('wdFieldIncludeText')
    wdFieldIndex = constant('wdFieldIndex')
    wdFieldIndexEntry = constant('wdFieldIndexEntry')
    wdFieldInfo = constant('wdFieldInfo')
    wdFieldKeyWord = constant('wdFieldKeyWord')
    wdFieldLastSavedBy = constant('wdFieldLastSavedBy')
    wdFieldLink = constant('wdFieldLink')
    wdFieldListNum = constant('wdFieldListNum')
    wdFieldMacroButton = constant('wdFieldMacroButton')
    wdFieldMergeBarcode = constant('wdFieldMergeBarcode')
    wdFieldMergeField = constant('wdFieldMergeField')
    wdFieldMergeRec = constant('wdFieldMergeRec')
    wdFieldMergeSeq = constant('wdFieldMergeSeq')
    wdFieldNext = constant('wdFieldNext')
    wdFieldNextIf = constant('wdFieldNextIf')
    wdFieldNoteRef = constant('wdFieldNoteRef')
    wdFieldNumChars = constant('wdFieldNumChars')
    wdFieldNumPages = constant('wdFieldNumPages')
    wdFieldNumWords = constant('wdFieldNumWords')
    wdFieldOCX = constant('wdFieldOCX')
    wdFieldPage = constant('wdFieldPage')
    wdFieldPageRef = constant('wdFieldPageRef')
    wdFieldPrint = constant('wdFieldPrint')
    wdFieldPrintDate = constant('wdFieldPrintDate')
    wdFieldPrivate = constant('wdFieldPrivate')
    wdFieldQuote = constant('wdFieldQuote')
    wdFieldRef = constant('wdFieldRef')
    wdFieldRefDoc = constant('wdFieldRefDoc')
    wdFieldRevisionNum = constant('wdFieldRevisionNum')
    wdFieldSaveDate = constant('wdFieldSaveDate')
    wdFieldSection = constant('wdFieldSection')
    wdFieldSectionPages = constant('wdFieldSectionPages')
    wdFieldSequence = constant('wdFieldSequence')
    wdFieldSet = constant('wdFieldSet')
    wdFieldShape = constant('wdFieldShape')
    wdFieldSkipIf = constant('wdFieldSkipIf')
    wdFieldStyleRef = constant('wdFieldStyleRef')
    wdFieldSubject = constant('wdFieldSubject')
    wdFieldSubscriber = constant('wdFieldSubscriber')
    wdFieldSymbol = constant('wdFieldSymbol')
    wdFieldTemplate = constant('wdFieldTemplate')
    wdFieldTime = constant('wdFieldTime')
    wdFieldTitle = constant('wdFieldTitle')
    wdFieldTOA = constant('wdFieldTOA')
    wdFieldTOAEntry = constant('wdFieldTOAEntry')
    wdFieldTOC = constant('wdFieldTOC')
    wdFieldTOCEntry = constant('wdFieldTOCEntry')
    wdFieldUserAddress = constant('wdFieldUserAddress')
    wdFieldUserInitials = constant('wdFieldUserInitials')
    wdFieldUserName = constant('wdFieldUserName')
    wdFieldBibliography = constant('wdFieldBibliography')
    wdFieldCitation = constant('wdFieldCitation')

class Field(Object):
    """ Field 对象

        methods
        ==========
        Copy
        Cut
        Delete
        DoClick
        Select
        Unlink
        Update
        UpdateSource

        properties
        ==========
        Application
        Code
        Creator
        Data
        Index
        InlineShape
        Kind
        LinkFormat
        Locked
        Next
        OLEFormat
        Parent
        Previous
        Result
        ShowCodes
        Type

    """
    @property
    def Application(self):
        return self.Instance.Application

    @property
    def Code(self) -> str:
        return self.Instance.Code

    @property
    def Creator(self):
        return self.Instance.Creator

    @property
    def Data(self):
        return self.Instance.Data

    @property
    def Index(self):
        return self.Instance.Index

    @property
    def InlineShape(self):
        return self.Instance.InlineShape

    @property
    def Kind(self):
        return self.Instance.Kind

    @property
    def LinkFormat(self):
        return self.Instance.LinkFormat

    @property
    def Locked(self):
        return self.Instance.Locked

    @property
    def Next(self):
        return self.Instance.Next

    @property
    def OLEFormat(self):
        return self.Instance.OLEFormat

    @property
    def Parent(self):
        return self.Instance.Parent

    @property
    def Previous(self):
        return self.Instance.Previous

    @property
    def Result(self):
        return self.Instance.Result

    @property
    def ShowCodes(self):
        return self.Instance.ShowCodes

    @property
    def Type(self) -> WdFieldType:
        return self.Instance.Type

    # methods
    def Copy(self):
        return self.Instance.Copy()

    def Cut(self):
        return self.Instance.Cut()

    def Delete(self):
        return self.Instance.Delete()

    def DoClick(self):
        return self.Instance.DoClick()

    def Select(self):
        return self.Instance.Select()

    def Unlink(self):
        return self.Instance.Unlink()

    def Update(self):
        return self.Instance.Update()

    def UpdateSource(self):
        return self.Instance.UpdateSource()

    def saveobj(self):
        return {
            'Class': 'Field',
            'Code': self.Code
        }



class Fields(Set):
    def __init__(self, instance):
        super().__init__(instance, Field)
